aboutsummaryrefslogtreecommitdiff
path: root/src/app/(collect)/q/[slug]
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-01-24 13:09:50 +0000
committerFuwn <[email protected]>2026-01-24 13:09:50 +0000
commit396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b (patch)
treeb9df4ca6a70db45cfffbae6fdd7252e20fb8e93c /src/app/(collect)/q/[slug]
downloadumami-main.tar.xz
umami-main.zip
Initial commitHEADmain
Created from https://vercel.com/new
Diffstat (limited to 'src/app/(collect)/q/[slug]')
-rw-r--r--src/app/(collect)/q/[slug]/route.ts61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/app/(collect)/q/[slug]/route.ts b/src/app/(collect)/q/[slug]/route.ts
new file mode 100644
index 0000000..24089bd
--- /dev/null
+++ b/src/app/(collect)/q/[slug]/route.ts
@@ -0,0 +1,61 @@
+export const dynamic = 'force-dynamic';
+
+import { NextResponse } from 'next/server';
+import { POST } from '@/app/api/send/route';
+import type { Link } from '@/generated/prisma/client';
+import redis from '@/lib/redis';
+import { notFound } from '@/lib/response';
+import { findLink } from '@/queries/prisma';
+
+export async function GET(request: Request, { params }: { params: Promise<{ slug: string }> }) {
+ const { slug } = await params;
+
+ let link: Link;
+
+ if (redis.enabled) {
+ link = await redis.client.fetch(
+ `link:${slug}`,
+ async () => {
+ return findLink({
+ where: {
+ slug,
+ },
+ });
+ },
+ 86400,
+ );
+
+ if (!link) {
+ return notFound();
+ }
+ } else {
+ link = await findLink({
+ where: {
+ slug,
+ },
+ });
+
+ if (!link) {
+ return notFound();
+ }
+ }
+
+ const payload = {
+ type: 'event',
+ payload: {
+ link: link.id,
+ url: request.url,
+ referrer: request.headers.get('referer'),
+ },
+ };
+
+ const req = new Request(request.url, {
+ method: 'POST',
+ headers: request.headers,
+ body: JSON.stringify(payload),
+ });
+
+ await POST(req);
+
+ return NextResponse.redirect(link.url);
+}